package com.chenpeixin;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCDemo {
    /*
    前提：
    1. 库有
    2. 表有
    3. 表里数据有，并且最好和我的一致
     */
    public static void main(String[] args) throws SQLException {
        // 进行连接 MySQL 服务器的一系列配置
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/db_11_24?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");
        mysqlDataSource.setUser("root");
        mysqlDataSource.setPassword("123456");
//        mysqlDataSource.setServerName("127.0.0.1");
//        mysqlDataSource.setPort(3306);                  // 大部分同学的默认端口没有修改过，如果修改过同学要注意
//        mysqlDataSource.setUser("root");
//        mysqlDataSource.setPassword("123456");          // 要用自己的密码
//        mysqlDataSource.setDatabaseName("db_11_24");    // 要用自己的库名
//        mysqlDataSource.setCharacterEncoding("utf8");
//        mysqlDataSource.setServerTimezone("Asia/Shanghai");
//        mysqlDataSource.setUseSSL(false);
        // 从 dataSource 从获取连接(Connection)
        try (Connection connection = mysqlDataSource.getConnection()) {

            // 准备好要执行的 SQL
            // 在 Java 代码中，以字符串形式体现 SQL
            String sql = "select * from exam_result order by id";
            // 要执行 SQL，需要从 Connection 对象中得到 XXXStatement
            // statement : 语句
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

                // 通过 XXXStatement 对象执行查询过程
                // execute
                // executeQuery: 用来执行查询类的 SQL，有查询结果
                // executeUpdate: 用来执行 增、删、改类似的操作，没有查询结果
                // Result 结果  Set 集合
                // ResultSet 查询到的结果集
                try (ResultSet resultSet = preparedStatement.executeQuery()) {

                    // 遍历我们的结果集，遍历过程是以行记录作为单位进行的操作
                    // 一次操作是一行
                    // resultSet.next()  1: 返回值代表是否还有新行   2: 让游标(cursor)走到下一行
                    //boolean hasNext = resultSet.next();
                    while (resultSet.next()) {
                        // 通过字段名称获取值
//                        int id = resultSet.getInt("id");
//                        System.out.println(id);

                        // 通过字段顺序获取值（顺序 SELECT 后边的顺序，* 就是建表顺序）
                        // 不是从 0 开始，是从 1 开始
//                        int id2 = resultSet.getInt(1);
//                        System.out.println(id2);

                        int id = resultSet.getInt("id");
                        String name = resultSet.getString("name");
                        double chinese = resultSet.getDouble("chinese");
                        double math = resultSet.getDouble("math");
                        double english = resultSet.getDouble("english");

                        System.out.printf("%d %s %.1f %.1f %.1f\n", id, name, chinese, math, english);
                    }
                }
            }
        }
        // 执行结束时，需要关闭 Connection
    }
}
